package com.stu.dcxy.juc;

import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

/**
 * @Author: MI
 * @Date: 2022/3/10/21:53
 * @Description:
 */
class BankAccount {
    //1 更新的对象属性必须使用 public volatile 修饰
    public volatile int money = 0;
    //以一种线程安全的方式操作非线程安全对象的某些字段
    String bankName = "ccb";
    //2 因为对象的属性修改类型原子类都是抽象类，所以每次使用都必须使用静态方法 newUpdater 创建一个更新器，并且需要设置想要更新的类和属性
    AtomicIntegerFieldUpdater fieldUpdater = AtomicIntegerFieldUpdater.newUpdater(BankAccount.class, "money");

    public void transfer() {
        fieldUpdater.incrementAndGet(this);

    }
}

public class AtomicIntegerFieldUpdaterDemo {

    public static void main(String[] args) {

        BankAccount bankAccount = new BankAccount();
        for (int i = 0; i < 1000; i++) {
            new Thread(() -> {
                bankAccount.transfer();
            }).start();
        }

        try {
            TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(5));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(bankAccount.money);
    }
}
